﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using System.Threading;

namespace TumbaloSoft.Controllers
{
    public class ReservaAreaComunController : TumbaloController
    {
        private static Object lockObject = new Object();
        public ActionResult Index()
        {
            if (defaultAction != null) return defaultAction;

            //try
            {
                if (ViewBag.permiso == 2 )
                {
                    ViewBag.listaAreas = HelperAreaComun.selectByIdEdificio(ViewBag.idEdificio);//se escogera en el futuro de acuerdo al edificio del usuario logueado
                }
                else
                {
                    if (ViewBag.permiso == 1)
                    {
                        ViewBag.listaAreas = HelperAreaComun.selectByListaEdificios(ViewBag.listaEdif);
                    }
                    else
                    {
                        ViewBag.listaAreas = HelperAreaComun.selectAll();
                    }
                }
            }
            /*catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar las areas comunes", ex);
                return View("~/Views/Shared/Error.cshtml");
            }*/

            return View();
        }

        public ActionResult Registrar(int? idAreaComun)
        {
            if (defaultAction != null) return defaultAction;

            if(!idAreaComun.HasValue)return HttpNotFound();
            AreaComun area = null;
            Edificio edif = null ;
            try
            {
                area = HelperAreaComun.selectById(idAreaComun.Value);
                edif = HelperEdificio.selectById(area.prEdificio.prIdEdificio);
                List<ReservaAreaComun> lista =HelperReservaAreaComun.selectFuturosByIdAreaComun(idAreaComun.Value);
                foreach(ReservaAreaComun res in lista){
                    res.prHoraInicio = DateTime.Parse(res.prHIni);
                    res.prHoraFin = DateTime.Parse(res.prHFin);
                }
                ViewBag.listaReservas = lista;
                ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar un area comun", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            if (area == null) return HttpNotFound();
            ReservaAreaComun reserva = new ReservaAreaComun();
            reserva.prAreaComun = area;
            reserva.prEdificio = edif;
            ViewBag.idPersona = AccountController.getIdPersona(HttpContext);
            if (ViewBag.permiso == 1)
            {
                List<ReservaAreaComun> reservaXProp;
                try
                {
                    reservaXProp = HelperReservaAreaComun.selectByIdPropietario(ViewBag.idPersona);
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al cargar las reservas", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                ViewBag.listaReservasXProp = new List<int>();
                foreach (ReservaAreaComun res in reservaXProp)
                {
                    ViewBag.listaReservasXProp.Add(res.prIdReserva);
                }
            }
            else
            {
                try
                {
                    List<int> lis = HelperPropietario.selectByIdEdificio(reserva.prEdificio.prIdEdificio);
                    ViewBag.ListaPropietarios = new List<Propietario>();
                    foreach (int idProp in lis)
                    {
                        ViewBag.ListaPropietarios.Add(HelperPropietario.selectById(idProp));
                    }
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al cargar la lista de propietarios", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
            return View(reserva);
        }

        [HttpPost]
        public ActionResult Registrar(ReservaAreaComun reserva)
        {
            if (defaultAction != null) return defaultAction;
            //al no recibir el codigo en el post hay que eliminar el error ya que se calcula automaticamente
             ModelState.Remove("prIdReservaAreaComun");
            ModelState.Remove("prEdificio.prArea");
            ModelState.Remove("prEdificio.prNroPisos");
            ModelState.Remove("prEdificio.prDireccion");
            ModelState.Remove("prEdificio.prNombre");
            ModelState.Remove("prEdificio.prMonto");
            ModelState.Remove("prAreaComun.prEdificio");
            ModelState.Remove("prAreaComun.prArea");
            ModelState.Remove("prAreaComun.prPrecioBase");
            ModelState.Remove("prPropietario.prSexo");
            ModelState.Remove("prPropietario.prCodigoDocumento");
            ModelState.Remove("prPropietario.prNombre");
            ModelState.Remove("prPropietario.prApellidoPaterno");
            ModelState.Remove("prPropietario.prDireccion");
            if (reserva.prHoraInicio >= reserva.prHoraFin)
            {
                ModelState.AddModelError("prHoraInicio", "La hora de inicio debe ser menor que la de fin");
                ModelState.AddModelError("prHoraFin", "La hora de fin debe ser menor que la de inicio");
            }
            reserva.prHoraInicio = reserva.prFechaReserva.AddTicks(reserva.prHoraInicio.TimeOfDay.Ticks);
            reserva.prHoraFin = reserva.prFechaReserva.AddTicks(reserva.prHoraFin.TimeOfDay.Ticks);
            reserva.prFechaReserva=reserva.prFechaReserva.AddTicks(reserva.prHoraInicio.TimeOfDay.Ticks);
            if (reserva.prFechaReserva.Date < DateTime.Now)
            {
                ModelState.AddModelError("prFechaReserva", "La fecha y hora debe ser en el futuro");
            }
            Monitor.Enter(lockObject);
            List<ReservaAreaComun> lista = HelperReservaAreaComun.selectFuturosByIdAreaComun(reserva.prAreaComun.prIdAreaComun);
            foreach (ReservaAreaComun res in lista)
            {
                res.prHoraInicio = DateTime.Parse(res.prHIni);
                res.prHoraInicio= res.prFechaReserva.AddTicks(res.prHoraInicio.TimeOfDay.Ticks);
                res.prHoraFin = DateTime.Parse(res.prHFin);
                res.prHoraFin= res.prFechaReserva.AddTicks(res.prHoraFin.TimeOfDay.Ticks);
                
                {
                    if (reserva.prHoraInicio >= res.prHoraInicio && reserva.prHoraInicio < res.prHoraFin ||
                        reserva.prHoraFin > res.prHoraInicio && reserva.prHoraFin <= res.prHoraFin)
                    {
                        ModelState.AddModelError("prFechaReserva", "Ese horario ya esta reservado haga otra seleccion");
                    }
                }
            }
            ViewBag.listaReservas = lista;
            ViewBag.idPersona = AccountController.getIdPersona(HttpContext);

            if (ModelState.IsValid)
            {
                try
                {
                    reserva.prIdReserva = HelperReservaAreaComun.selectMaxCodigo() + 1;
                    HelperReservaAreaComun.insert(reserva);
                    Monitor.Exit(lockObject);
                }
                catch(Exception ex)
                {
                    Monitor.Exit(lockObject);
                    Logger.Current.Error("Error al insertar una reserva area comun", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                ViewBag.mensaje = "Se registro correctamente la reserva con ID= " + reserva.prIdReserva;
                ViewBag.returnURL = "/ReservaAreaComun";
                return View("~/Views/Shared/Exito.cshtml");
            }
            else { Monitor.Exit(lockObject);
            if (ViewBag.permiso == 1)
            {
                List<ReservaAreaComun> reservaXProp;
                try
                {
                    reservaXProp = HelperReservaAreaComun.selectByIdPropietario(ViewBag.idPersona);
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al cargar las reservas", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                ViewBag.listaReservasXProp = new List<int>();
                foreach (ReservaAreaComun res in reservaXProp)
                {
                    ViewBag.listaReservasXProp.Add(res.prIdReserva);
                }
            }
            else
            {
                try
                {
                    List<int> lis = HelperPropietario.selectByIdEdificio(reserva.prEdificio.prIdEdificio);
                    ViewBag.ListaPropietarios = new List<Propietario>();
                    foreach (int idProp in lis)
                    {
                        ViewBag.ListaPropietarios.Add(HelperPropietario.selectById(idProp));
                    }
                }
                catch (Exception ex)
                {
                    Logger.Current.Error("Error al cargar la lista de propietarios", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
                return View(reserva); };
        }

        public ActionResult Eliminar(int? idReservaAreaComun)
        {
            if (defaultAction != null) return defaultAction;

            if (!idReservaAreaComun.HasValue) return HttpNotFound("Esta página no existe");//se llamo sin parametro deberia devolver error
            ReservaAreaComun reserva;
            try
            {
                reserva = HelperReservaAreaComun.selectById(idReservaAreaComun.Value);
                if (reserva == null) return HttpNotFound("No existe la reserva con el código " + idReservaAreaComun.Value);
                //convertir la hora leida de string a date time
                reserva.prHoraInicio = DateTime.Parse(reserva.prHIni);
                reserva.prHoraFin = DateTime.Parse(reserva.prHFin);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar una reserva area comun", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View(reserva);

        }

        [HttpPost]
        public ActionResult Eliminar(int idReservaAreaComun,ReservaAreaComun reserva)
        {
            if (defaultAction != null) return defaultAction;
            reserva.prIdReserva = idReservaAreaComun;
            try
            {
                HelperReservaAreaComun.delete(reserva);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al eliminar una reserva area comun", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            ViewBag.mensaje = "Se elimino correctamente la reserva con ID= " + reserva.prIdReserva;
            ViewBag.returnURL = "/ReservaAreaComun";
            return View("~/Views/Shared/Exito.cshtml");

        }
    }   
}
